<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    // Promise的优点:
    // 有了Promise对象，就可以将异步操作以同步操作的流程表达出来，避免了层层嵌套的回调函数

    // Promise实例 的拓展方法:
    // Promise.prototype.then   then()为 Promise 实例添加状态改变时的回调函数  => 方法可以指定两个函数作为参数(回调函数)   =>  提前指定了Promise状态改变时要执行的回调函数
    // callback1  => 当Promise对象由pending(进行中)改为fulfilled(已成功)时,会执行此回调函数
    // callback2  => 当Promise对象由pending(进行中)改为rejected(已失败)时,会执行此回调函数
    // callback1(arg) callback2(arg) 都有一个形参, 用于接收Promise实例中存储的数据
    // 返回值: 新的Promise对象


    // Promise.prototype.catch  指定Promise对象变为已失败状态时执行的回调函数
    // 等价于 Promise.prototype.then(null,callback) 
    // Promise.prototype.catch = function(callback){
    //     return this.then(null,callback)
    // }
    // 返回值: 新的Promise对象

    // 链式操作(then和catch的链式操作)
    // p.then().catch()
    // p.then().then().then().then().then().then().catch()

    // Promise.prototype.finally   finally()方法用于指定不管 Promise 对象最后状态如何，都会执行的操作。该方法是 ES2018 引入标准的。

    // Promise.prototype.finally = function(callback){
    //     return this.then(function(){
    //         callback();
    //     },function(){
    //         callback();
    //     })
    // }


    // debugger;
    var p = new Promise(function (resolve, reject) {
        //  回调函数 => 容器 => 用于存放要执行的代码(通常是异步代码,同步也可以)
        // 当前函数数据同步任务 -> new Promise() 传入函数时立即执行
        setTimeout(() => {  // 2s后改变状态
            // debugger;
            var num = Math.random(); // 0-1
            console.log(num);

            if (num >= 0.5) { // 正面 => 不拖堂
                resolve(true);
            } else { // 反面 => 拖堂
                reject(false);
            }
            console.log(p);
        }, 3000);
    });
    console.log(p);   // {<pending>:undefined}

    p.then(function (arg) {
        console.log("fulfilled", arg);
    }).catch(function (arg) {
        console.log("fulfilled", arg);
    }).finally(function(){
        console.log("异步操作执行完毕");
    })






</script>

</html>